package com.zh.lamemp3androidconverter.util;

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.OpenableColumns;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;

/**
 * Uri工具类
 */
public class UriUtil {
    private UriUtil() {
    }

    /**
     * 将 File 转换为安全的 Uri（自动处理 FileProvider 兼容性）
     *
     * @param context 上下文对象
     * @param file    需要转换的文件对象
     * @return 适用于当前系统的 Uri，可能为 null（需检查配置）
     * @throws IllegalArgumentException 如果 FileProvider 路径配置错误
     */
    public static Uri fileToUri(Context context, File file) {
        if (context == null || file == null) {
            throw new IllegalArgumentException("Context or File cannot be null");
        }

        try {
            // 优先使用 FileProvider（API 24+ 必须）
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                String authority = context.getPackageName() + ".fileprovider";
                return androidx.core.content.FileProvider.getUriForFile(context, authority, file);
            } else {
                // 旧版本直接使用 file://
                return Uri.fromFile(file);
            }
        } catch (IllegalArgumentException e) {
            // 捕获路径配置错误（例如 file_paths.xml 未包含目标路径）
            throw new IllegalArgumentException(
                    "FileProvider configuration error. Check file_paths.xml for path: "
                            + file.getAbsolutePath(), e
            );
        }
    }

    /**
     * 将 Uri 转换为临时文件（适用于 content:// 或 file:// 类型的 Uri）
     *
     * @param context 上下文
     * @param uri     文件 Uri
     * @return 临时 File 对象（需自行管理删除）
     * @throws IOException 如果文件无法复制
     */
    public static File uriToFile(Context context, Uri uri) throws IOException {
        // 获取文件名
        String fileName = getFileName(context, uri);

        // 创建临时文件（存储在缓存目录）
        File tempFile = File.createTempFile("temp_", fileName, context.getCacheDir());

        try (InputStream inputStream = context.getContentResolver().openInputStream(uri);
             FileOutputStream outputStream = new FileOutputStream(tempFile)) {

            if (inputStream == null) {
                throw new FileNotFoundException("无法打开 Uri 的输入流");
            }

            // 将输入流写入临时文件
            byte[] buffer = new byte[4 * 1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            return tempFile;
        }
    }

    /**
     * 从 Uri 中获取原始文件名
     */
    private static String getFileName(Context context, Uri uri) {
        String fileName = null;
        if (Objects.equals(uri.getScheme(), "content")) {
            Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
            if (cursor != null && cursor.moveToFirst()) {
                int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
                if (nameIndex != -1) {
                    fileName = cursor.getString(nameIndex);
                }
                cursor.close();
            }
        }
        // 如果无法获取文件名，使用 Uri 的路径部分
        if (fileName == null) {
            String path = uri.getPath();
            if (path != null) {
                int cut = path.lastIndexOf('/');
                if (cut != -1) {
                    fileName = path.substring(cut + 1);
                }
            }
        }
        return fileName != null ? fileName : "unnamed_file";
    }
}
